/*
 * Copyright (c) 2025 CAX Conversion Project
 */
package com.comac.ins.isfd.service;

import java.io.IOException;
import java.util.Collection;
import java.util.Date;
import java.util.List;

import org.springframework.web.multipart.MultipartFile;

import com.comac.ins.common.mybatis.core.page.PageQuery;
import com.comac.ins.common.mybatis.core.page.TableDataInfo;
import com.comac.ins.isfd.domain.bo.IsfdModelBo;
import com.comac.ins.isfd.domain.vo.IsfdModelVo;
import com.comac.ins.isfd.domain.vo.ModelCountObjectVo;
import com.comac.ins.isfd.domain.vo.ModelCountResultObjectVo;
import jakarta.servlet.http.HttpServletResponse;

/**
 * 模型库service层接口
 *
 * @author hxloongs
 * @date 2024-7-1
 */
public interface IIsfdModelService {

    /**
     * 模型数据数量
     *
     * @return 结果
     */
    List<ModelCountObjectVo> listCount();

    /**
     * 按模型数据字段,统计模型数据数量
     *
     * @return 结果
     */
    List<ModelCountResultObjectVo> listApplicableCountByField(String field);


    /**
     * 模型创建时间数据数量
     *
     * @return 结果
     */
    List<ModelCountResultObjectVo> listTimeCount(String field, Date startTime, Date endTime);

    /**
     * 根据 modelId 从缓存或数据库中获取 IsfdModelVo 对象
     *
     * @param modelId 模型库id
     * @return IsfdModelVo 对象，包含文件信息
     */
    IsfdModelVo getById(Long modelId);

    /**
     * 分页列表查询模型库
     *
     * @param isfdModelBo OSS对象存储分页查询对象
     * @param pageQuery   分页查询实体类
     * @return 结果
     */
    TableDataInfo<IsfdModelVo> queryPageList(IsfdModelBo isfdModelBo, PageQuery pageQuery);

    /**
     * 删除模型库
     *
     * @param ids     模型库id集合
     * @param isValid 判断是否需要校验
     * @return 结果
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);

    /**
     * 上传 MultipartFile 到对象存储服务，并保存文件信息到数据库
     *
     * @param file        要上传的 MultipartFile 对象
     * @param isfdModelBo 模型元信息
     * @return 上传成功后的 IsfdModelVo 对象，包含文件信息
     */
    IsfdModelVo save(MultipartFile file, IsfdModelBo isfdModelBo);

    /**
     * 文件下载方法，支持一次性下载完整文件
     *
     * @param modelId  模型库id
     * @param response HttpServletResponse对象，用于设置响应头和向客户端发送文件内容
     */
    void download(Long modelId, HttpServletResponse response) throws IOException;
}
